iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0

[Day20] Clojure vs Java / ClojureScript vs Javascript

行百里而半九十,鐵人賽完成了2/3啦!

前面我們已經了解不少Clojure的基礎語法和概念~

包含了以下主題:

其實還有一些概念是自己很想在做完研究功課後跟大家聊聊的,
像是:

但是剩下十天左右,是該繼續向前走,從Clojure基礎語法,進階到ClojureScript的小型專案。

希望鐵人賽結束之後,也能維持動力再繼續擴充自己有興趣的主題~


我們知道,
Clojure和Java是後端語言,
ClojureScript和JavaScript是前端語言 (However, Node.js是後端);

然後雖然工程師都明白,Java和JavaScript完全沒什麼關係 XDDD ?

Clojure和ClojureScript則是一體兩面。

再談 Clojure vs Java

Clojure是一個基於Java平台的Functional programming語言

來看一下網路上大大畫的clojure程式complie後的圖 :

ref

之前前面的文章在討論Clojure時,常常看到Java的影子
例如:

  • OOME的error msg
(iterate inc 5)
=> Error printing return value (OutOfMemoryError) at java.util.Arrays/copyOf (Arrays.java:3332).
Java heap space
  • 轉型時會看到諸如java.lang.Long 此類的Java 資料型別

Clojure是一個基於Java平台去發展的語言,但當然也有一些Java沒有的優點,例如Immutable Data Structures(不可變的資料結構)。這意味著工程師做操作時不會改變Data Structures裡的值,而回傳的時候會建立加上新的值的Data Structures。

昨天也講到了Clojure鼓勵pure function。function的回傳值只會根據輸入的參數有所變動,跟其他變動完全無關。只要參數一樣,每次的值都會是一樣。所以工程師在測試時不用考慮太多外部可能會造成未知的改變。

此外,我從這篇文章: Clojure Vs. Java: Comparison Guide In 2021還學到一個單字homoiconicity(同像性),是Lisp語言的共同特性,它的設計讓我們很容易進行對sequence的操作,將語言中的所有程式碼當成data來存取以及轉換。

當code被視為資料,會使meta programming變得更加容易。
因為可在運行時code時,存取本身擁有的function和process,並以編程的方式重新設計自己。

那 ClojureScript和Javascript的關係勒?

ClojureScript是Clojure基於Javascript上的實作,host在Javascript VM上,而且有dependency management。

ClojureScript會被complie成JavaScript,其編譯器可使用 Google Closure Compiler將complie的javascript進行最佳化。

ref

ClojureScript's Differences from Clojure

去看ClojureScript doc的文件就會發現ClojureScript和Clojure文件的API超級像, 但其standard library是 Clojure 的子集合(例如常見的clojure.string、clojure.set、clojure.walk、clojure.zip 等)

ClojureScript complier上面沒有javascript的code,它是靠著Clojure编寫,這代表當編譯器運行時需要回到Java VM 上。

我們下一篇會來理解一下,ClojureScript試著去解決Javascript的什麼問題,並且明天就來開起一個clojureScript小專案~

如果想要延伸閱讀ClojureScript和Clojure還有什麼差異,可以看官方文件的說明

Let's Learn ClojureScript together!

ClojureScript也和Clojure一樣支援REPL-driven development(「讀取-求值-輸出」循環;Read-Eval-Print Loop,簡稱REPL)。

我們可以說,之前對Clojure的基礎學習都是為了幫現在開始的ClojureScript做鋪梗~

本系列文之後的javascript文章(理想上的進度)會以 Learn ClojureScript 為主軸,搭配另一個我愛的Clojurescript cheetsheet網頁做介紹。

如果有足夠的篇幅,希望能介紹像是reagent: Minimalistic React for ClojureScriptreframe: a ClojureScript framework for building UI,帶給大家更豐富的內容!

Ref


上一篇
[Day19] Clojure Laziness (3) 淺談side-effect
下一篇
[Day21] 建立ClojureScript專案
系列文
後端Developer實戰ClojureScript: Reagent與前端框架 Reframe30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言